#Requires AutoHotkey v2.0
; #include Tool.ahk  ; 仅在测试时包含
; #include TextProcessor.ahk ; 仅在测试时包含

; 处理CSV文件
class CSV_Pcr extends TextProcessor{
    
    text := ""
    content := []
    errTip := "#无数据#"
    special := [",","`n","`r"]
    ; 读
    read(text := this.text) {
        this.text := text
        
        ; 声明局部变量
        local table := [], rows := [], row := 1, cells := []
    
        
        local s := 1, e := 1, len := StrLen(this.text)
        
        loop parse this.text{
            
            ;MsgBox(A_LoopField)

            if(A_LoopField == "`n"){ ;换行分割符

                if(A_Index - 1 <= 0){
                    continue
                }

                if(A_Index + 1 >= len){
                    continue
                }

                if(SubStr(this.text, A_Index - 1, 1) == "`""){
                    continue
                }

                if(SubStr(this.text, A_Index + 1, 1) == "`""){
                    continue
                }
                
                e := A_Index ; e的位置就是换行的位置
                
                
            }

            if(e != s){ ; 切割字符串

                row := ""
                t := e - s
                row := SubStr(this.text, s, (e-s))
                rows.Push(row)
                s := ++e ; 跳过换行
            }
            
        }

        ; 最后一行数据
        MsgBox "aa"
        row := ""
        t := len - s
        row := SubStr(this.text, s, (len-s))
        rows.Push(row)

        
        local inQuote := 0 ; 是否进入引号
        MsgBox "ssss" rows.length
        loop rows.length{

            rows[A_Index] := Trim(rows[A_Index],"`r`n")
            cells:= []
            
            MsgBox "K" rows[A_Index] "[" s ":" e "]"

            s := 1, e := 1, len := StrLen(rows[A_Index])
            row := A_Index

            loop parse rows[row]{

                if(A_LoopField == "`""){
                    if(inQuote){ ; 已经在引号中了(第二次匹配到引号)
                         e := A_Index
                         inQuote := 0 ; 出引号
                    } else {
                        s := A_Index + 1
                        e := A_Index + 1
                        inQuote := 1 ; 进引号
                    }
                    
                }

                if(A_LoopField == ","){ ; 逗号分割符

                    if(A_Index - 1 <= 0){
                        continue
                    }
    
                    if(A_Index + 1 >= len){
                        continue
                    }
    
                    if(SubStr(rows[row], A_Index - 1, 1) == "`""){
                        continue
                    }
    
                    if(SubStr(rows[row], A_Index + 1, 1) == "`""){
                        continue
                    }
                    
                    e := A_Index ; e的位置就是逗号的位置
                }

                if(e != s){ ;切割字符串

                    cell := ""
                    t := e - s
                    cell := SubStr(rows[row], s, (e-s))
                    ;MsgBox "K" cell "[" s ":" e "]"
                    cells.Push(cell)
                    s := ++e ; 
                }
            }
            
             
            
        
        table.push(cells)
        
        }
        
        
        
        this.content := table
    }
    
    ; 写
    write(content := this.content){
        
        this.content := content
        
        ; 声明局部变量
        local table := this.content, rows := "", row, cell
        
        ; 遍历每一行
        for row in table {
            ; 遍历每一个元素
            for cellIndex, cell in row{

                cell := this._formatCell(cell)
                if(cellIndex == row.length){
                    rows .= cell ; 一行的最后一个元素不加逗号(分割符)
                    break
                }
                rows .= cell . "," ; 加逗号(分割符)
        
            }
            rows .= "`n" ; 加换行
        }

        return rows
    }
    

    ; 获取某个单元格的数据(row 第几行 col 第几列)
    getCell(row,col){

        if(!this.content){ ; 不存在
            return this.errTip
        }

        if(this.content.length == 0){
            return this.errTip ; 无数据
        }
         return this.content[row][col]
    } 
    
    ; 格式化单元格
    _formatCell(cell) {
        
        if(!InStr(cell,",") && !InStr(cell,"`"")){
            return cell
        }

        ; 如果单元格包含双引号，则替换为两个双引号
        cell := StrReplace(cell, "`"", "`"`"")
        
        ; 为特殊字符加上引号
        cell := this._addQuote(cell)
    
        return cell
    }
    
    ; 加引号
    _addQuote(cell){
        loop parse this.special.length{
            cell := StrReplace(cell, this.special[A_LoopField], "`"" . this.special[A_LoopField] . "`"")
        }
        return cell
    }

}

